	.text
SuperGarbage:

whileLoop: 
	// whileLoop's evaluate condition  
	or		%g0, 1, %l0			
	cmp		%l0, %g0
	be		whileLoopExit
	sethi	0, %g0				// nop
	
	// whileLoop's true 
	
	// struct inst *instruction = &(mem[pc]);
	add 	%o0, %o1, %l0
	st 		%l0, [%i6-5]
	
	// int op = instruction->op
	ld		[%l0], %l1
	st		%l1, [%i6-10]
	
	// int srcA = instruction->srcA;
	add		%l0, 5, %l1
	ld		[%l1], %l1
	st		%l1, [%i6-15]
	
	// int srcB = instruction->srcB;
	add		%l0, 10, %l2		
	ld		[%l2], %l2
	st		%l2, [%i6-20]
	
	// int dest = instruciton->dest;
	add		%l0, 15, %l3
	ld		[%l3], %l3
	st		%l3, [%i6-25]
	
	// pc = pc + 4
	add		%o0, 4, %o0
	
	// mem[srcA] = %l1
	ld		[%o1], %l4
	add		%l4, %l1, %l1
	ld		[%l1], %l1
	
	// mem[srcB] = %l2
	add		%l4, %l2, %l2
	ld		[%l2], %l2
	
	// mem[dest] = %l3
	add		%l4, %l3, %l3
	
	// switch statement
	ld		[%i6-10], %l0
	// sethi 	%hi(%l0), %l1
	// ld 		[%l1 + %lo(%l0)], %l2	
	cmp 	%l0, %g0
	bne 	switchCase1
	sethi	0, %g0			// nop
	
	// case 0:
	// mem[dest] = mem[srcA] - mem[srcB]; 
	sub		%l1, %l2, %l4
	st		%l4, [%l3]	
	
	// break;
	ba 		switchEnd
	sethi	0, %g0			// nop
	
switchCase1:
	cmp 	%l0, 1
	bne		switchCase2
	sethi	0, %g0			// nop
	
	// case 1:
	// mem[dest] = mem[srcA] >> 1;
	srl		%l1, 1, %l4
	st		%l4, [%l3]
	
	// break
	ba		switchEnd
	sethi	0, %g0			// nop
	
switchCase2:
	cmp		%l0, 2
	bne		switchCase3
	sethi	0, %g0			// nop
	
	// case 2:
	// mem[dest] = ~(mem[srcA] | mem[srcB]);
	or		%l1, %l2, %l4
	xnor	%l4, %g0, %l4	// not operation
	st		%l4, [%l3]
	
	// break
	ba		switchEnd
	sethi	0, %g0			// nop

switchCase3:
	cmp		%l0, 3
	bne		switchCase4
	sethi	0, %g0			// nop
	
	// case 3:
	// temp = mem[srcB];
	st		%l2, [%i6-30]
	
	// mem[dest] = mem[mem[srcA]];
	add		%l4, %l1, %l4
	ld		[%l4], %l0
	st		%l0, [%l3]
	
	// mem[mem[srcA]]= temp;
	st		%l2, [%l4]
	
	// break
	ba		switchEnd
	sethi	0, %g0			// nop

switchCase4:
	cmp		%l0, 4
	bne		switchCase5
	sethi	0, %g0			// nop
	
	// case 4:
	// in mem[dest], mem[srcA];
	ld		[%l3], %l3
	in		%l3, %l1
	
	// break
	ba		switchEnd
	sethi	0, %g0			// nop	
	
switchCase5:
	cmp		%l0, 5
	bne		switchCase6
	sethi	0, %g0			// nop
	
	// case 5: 
	// out mem[srcA], mem[srcB];
	out		%l1, %l2
	
	// break
	ba		switchEnd
	sethi	0, %g0			// nop
	
switchCase6:
	cmp		%l0, 6
	bne		switchCase7
	sethi	0, %g0			// nop
	
	// case 6:
	// mem[dest] = pc;
	st		%o1, [%l3]
	
	// if (mem[srcA] < 0)
	cmp		%l1, %g0
	bge		ifExit
	sethi	0, %g0			// nop
	
	// pc = mem[srcB];
	mov		%l2, %o0
	
ifExit:
	
	// break
	ba		switchEnd
	sethi	0, %g0			// nop	
	
switchCase7:
	or		%g0, %o0, %i0	// mov pc to %i0 
	jmpl	%i2+8, %g0		// ret
	restore	%g0, %g0, %g0	// restore

switchEnd:	
	
	// whileLoop's branch always
	ba		whileLoop
	sethi	0, %g0				// nop
	
	// whileLoop's false 
whileLoopExit:

	jmpl	%i2+8, %g0		// ret
	restore	%g0, %g0, %g0	// restore

